/* ***** BEGIN LICENSE BLOCK *****
   Version: Apache 2.0/GPL 3.0/LGPL 3.0

   CCT - Computational Chemistry Tools
   JMolEditor - Java Molecules Editor

   Copyright 2008 Dr. Vladislav Vasilyev

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

   Contributor(s):
     Dr. Vladislav Vasilyev <vvv900@gmail.com>       (original author)

  Alternatively, the contents of this file may be used under the terms of
  either the GNU General Public License Version 2 or later (the "GPL"), or
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  in which case the provisions of the GPL or the LGPL are applicable instead
  of those above. If you wish to allow use of your version of this file only
  under the terms of either the GPL or the LGPL, and not to allow others to
  use your version of this file under the terms of the Apache 2.0, indicate your
  decision by deleting the provisions above and replace them with the notice
  and other provisions required by the GPL or the LGPL. If you do not delete
  the provisions above, a recipient may use your version of this file under
  the terms of any one of the Apache 2.0, the GPL or the LGPL.

 ***** END LICENSE BLOCK *****/

package cct.interfaces;

import java.util.List;
import java.util.Map;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: ANU</p>
 *
 * @author Dr. V. Vasilyev
 * @version 1.0
 */
public interface MoleculeInterface {

  static Integer WIREFRAME = 0;
  static Integer STICKS = 1;
  static Integer BALL_AND_STICKS = 2;
  static Integer SPACEFILL = 3;

  public static final String OUTPUT_RESULTS = "_OutputResults";
  public static final String VIBRATION_RENDERER = "_VibrationRenderer";

  public static final String RenderingStyle = "RenderingStyle";
  public static final String AtomicSets = "AtomicSets";

  public static final String ChargeProperty = "Charge";
  public static final String MultiplicityProperty = "Multiplicity";
  public static final String SCFEnergyProperty = "SCF Energy";
  public static final String MP2EnergyProperty = "MP2 Energy";
  public static final String MP3EnergyProperty = "MP3 Energy";
  public static final String MP4DEnergyProperty = "MP4D Energy";
  public static final String MP4DQEnergyProperty = "MP4DQ Energy";
  public static final String MP4SDQEnergyProperty = "MP4SDQ Energy";
  public static final String CCSDEnergyProperty = "CCSD Energy";
  public static final String CCSDTEnergyProperty = "CCSDT Energy";
  public static final String DipoleMomentProperty = "Dipole";
  public static final String PolarizabilityProperty = "Polarizability";
  public static final String MullikenChargesProperty = "Mulliken charges";
  public static final String ESPChargesProperty = "ESP charges";
  public static final String FrameGroupProperty = "FrameGroup";
  public static final String S_SquaredProperty = "S**2";
  public static final String ZeroPointCorrProperty = "ZPCorr";
  public static final String EnergyThermCorrProperty = "EnergyTC";
  public static final String EnthalpyThermCorrProperty = "EnthalpyTC";
  public static final String GibbsThermCorrProperty = "GibbsTC";
  public static final String ImaginaryFreqsProperty = "ImaginaryFreqs";
  public static final String NotesProperty = "Notes";
  public static final String ProgramProperty = "Program";
  public static final String VersionProperty = "Version";
  public static final String PeriodicBox = "PeriodicBox";
  String LATTICE_VECTORS = "LatticeVectors";
  String LATTICE_PARAMETERS = "LatticeParamaters";

  void addAtom(AtomInterface a);

  void addAtom(AtomInterface a, int monomer_number);

  void addAtom(AtomInterface a, int n, String name);

  void addBond(BondInterface b);

  void addMonomer(String monomer_name);

  void addProperty(String propName, Object value);

  /**
   * Adds atoms from molecule "mol" (not their copies)
   * @param mol MoleculeInterface
   */
  void mergeMolecule(MoleculeInterface mol);

  /**
   * Adds COPIES of atoms from molecule "mol"
   * @param mol MoleculeInterface
   */
  void appendMolecule(MoleculeInterface mol);

  void centerMolecule(float x, float y, float z);

  AtomInterface deleteAtom(int n);

  BondInterface deleteBond(BondInterface bond_to_delete);

  int getAtomIndex(AtomInterface a);

  AtomInterface getAtomInterface(int i);

  int getBondIndex(BondInterface b);

  BondInterface getBondInterface(int i);

  MonomerInterface getMonomerInterface(int n);

  String getName();

  AtomInterface getNewAtomInstance() throws NullPointerException;

  BondInterface getNewBondInstance() throws NullPointerException;

  BondInterface getNewBondInstance(AtomInterface a, AtomInterface b) throws
      NullPointerException;

  int getNumberOfAtoms();

  int getNumberOfBonds();

  int getNumberOfMonomers();

  List getMolecularSubstructure();

  Map getProperties();

  Object getProperty(String key);

  float getXmax();

  float getXmin();

  float getYmax();

  float getYmin();

  float getZmax();

  float getZmin();

  MoleculeInterface getInstance();

  void guessCovalentBondsBetweenMonomers(int n, int m);

  void guessCovalentBondsInMonomer(int n);

  void setName(String name);
}
